package com.alibaba.yinan.domain.common.extension;

import com.alibaba.cola.exception.BizException;
import com.alibaba.cola.extension.BizScenario;
import com.alibaba.cola.extension.ExtensionExecutor;
import com.alibaba.cola.extension.ExtensionPointI;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.function.BiFunction;

/**
 * @ClassName ExtensionBasedSelector
 * @Author mengke
 * @create 2025/8/3 22:46
 * @Description 通用的策略选择器（基于 Cola 扩展点机制）
 */
@Component
public class ExtensionBasedSelector {

    @Resource
    private ExtensionExecutor extensionExecutor;

    /**
     * 遍历所有策略 key，找到首个支持的扩展并执行操作
     *
     * @param extPtClass 扩展点接口类型
     * @param policyKeys 策略 key 列表
     * @param scenario   Cola 业务场景标识
     * @param executorFn 实际执行的逻辑函数（扩展点对象, 当前 policyKey） -> 返回结果
     * @param <R>        返回结果类型
     * @param <EXT>      扩展点类型
     * @return 首个非 null 结果
     */
    public <R, EXT extends ExtensionPointI> R executeFirstSupported(
            Class<EXT> extPtClass,
            List<String> policyKeys,
            BizScenario scenario,
            BiFunction<EXT, String, R> executorFn
    ) {
        for (String key : policyKeys) {
            R result = extensionExecutor.execute(extPtClass, scenario, ext -> {
                R r = executorFn.apply(ext, key);
                return r;
            });
            if (result != null) {
                return result;
            }
        }
        throw new BizException("无匹配扩展策略：" + policyKeys);
    }
}
